package dto

import (
	"fmt"
	"strings"
	"time"
)

// Timex 自定义时间解析方式
// desc:时间类型
// description: Go语言内置的 json 包使用 RFC3339 标准中定义的时间格式，对我们序列化时间字段的时候有很多限制。
type Timex struct {
	time.Time
}

const ctLayout = "2006-01-02 15:04:05"

var nilTime = (time.Time{}).UnixNano()

// UnmarshalJSON  实现了json.Unmarshaler接口中的方法
func (ct *Timex) UnmarshalJSON(b []byte) (err error) {
	s := strings.Trim(string(b), "\"")
	if s == "null" {
		ct.Time = time.Time{}
		return
	}
	ct.Time, err = time.Parse(ctLayout, s)
	return
}

// MarshalJSON 实现了json.Marshaler接口中的方法
func (ct *Timex) MarshalJSON() ([]byte, error) {
	if ct.Time.UnixNano() == nilTime {
		return []byte("null"), nil
	}
	return []byte(fmt.Sprintf("\"%s\"", ct.Time.Format(ctLayout))), nil
}

func (ct *Timex) IsSet() bool {
	return ct.UnixNano() != nilTime
}
